package com.baway.common.vm
import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.newFixedThreadPoolContext
import kotlinx.coroutines.newSingleThreadContext
import java.util.concurrent.Executors

/**
 * Author: Jason Zhang
 * Date: 2025/8/18
 * Desc: 基础ViewModel层
 *
 * ViewModel和AndroidViewModel的主页区别在于是否需要上下文对象
 *
 * ViewModel中业务：
 * 1.利用协程获取网络请求
 * 2.使用LiveData或StateFlow来管理数据
 * 3.通知View数据变化
 *
 * 注意：以前使用LiveData来缓存数据，存在数据倒灌问题，官方推荐在Kotlin中使用Flow流，如果是Java中官方推荐SingeLiveEvent或unPeekLiveData
 */

abstract class BaseViewModel: ViewModel() {

    //定义LiveData缓存数据
    val mError = MutableLiveData<String>()

    //统一协程异常处理
    private val mExceptionHandler = CoroutineExceptionHandler{_, exception->
        Log.e("Coroutine Error", "Exception ===> \n" + exception.message)
        mError.postValue("ViewModel层发生异常：" + exception.message)
    }

    //自定义协程作用域，SupervisorJob()创建独立协程作用域，避免影响父协程和同级协程
    protected val mViewModelScope = CoroutineScope(Dispatchers.Main + SupervisorJob() + mExceptionHandler)

    //自定义协程调度器（线程池）
    protected val mDispatcher = Executors.newFixedThreadPool(10).asCoroutineDispatcher() //使用Java的方式创建线程池

    protected val mSingeDispatcher = newSingleThreadContext("SingleTreadDispatcher") //使用Kotlin中函数创建单线程池

    protected val mFixedThreadDispatcher = newFixedThreadPoolContext(16, "SingleTreadDispatcher") //使用Kotlin中函数创建固定数量线程池



}